/**
 * @file GridStructs.h
 * @brief 网格相关数据结构定义
 * 
 * 定义了网格处理所需的基本数据结构，包括：
 * 1. 网格尺寸(GridSize)
 * 2. 网格数据(GridData)
 * 3. 处理后的数据(ProcessedData)
 * 4. 节点和单元数据
 */
#pragma once
#include <vector>
#include <string>
#include "Point3D.h"
#include <map>
#include <set>

/**
 * @brief 网格尺寸结构
 * 
 * 存储网格在三个维度上的大小
 */
struct GridSize {
    int Nx;  ///< X方向网格数量
    int Ny;  ///< Y方向网格数量
    int Nz;  ///< Z方向网格数量
    
    /**
     * @brief 默认构造函数
     */
    GridSize() : Nx(0), Ny(0), Nz(0) {}
};

/**
 * @brief 网格数据结构
 * 
 * 存储角点网格的完整数据
 */
struct NodeData {
    double value;           // 数值
    std::string raw_str;    // 原始字符串表示
    
    NodeData(double v, const std::string& s) : value(v), raw_str(s) {}
    
    // 添加隐式转换运算符
    operator double() const { return value; }
};

struct GridData {
    GridSize size;                           ///< 网格尺寸
    std::vector<NodeData> coord_data;        ///< 坐标数据(一维数组优化)
    std::vector<NodeData> zcorn_data;        ///< 深度角点数据
    std::vector<int> actnum_data;            ///< 活动单元标志
};

/**
 * @brief 处理后的数据结构
 * 
 * 存储转换后的有限元网格数据
 */
struct ProcessedData {
    std::vector<std::vector<double>> nodes;     ///< 节点坐标数据
    std::vector<std::vector<int>> elements;     ///< 单元连接关系
    int hex_count = 0;                          ///< 六面体单元数量
    int prism_count = 0;                        ///< 三棱柱单元数量
    std::map<int, int> centerNodeMap;           ///< 六面体单元ID到中心节点ID的映射
    std::set<int> fault_nodes;                  ///< 断层节点编号集合
};

/**
 * @brief 节点结构
 * 
 * 存储节点的空间位置和编号
 */
struct Node {
    int id;        ///< 节点编号
    Point3D pos;   ///< 节点坐标

    /**
     * @brief 构造函数
     * @param _id 节点编号
     * @param _pos 节点坐标
     */
    Node(int _id, const Point3D& _pos) : id(_id), pos(_pos) {}
};

/**
 * @brief 单元结构
 * 
 * 存储单元的节点连接关系和类型
 */
struct Element {
    int id;                     ///< 单元编号
    std::vector<int> nodes;     ///< 单元节点编号列表
    int type;                   ///< 单元类型(10=四面体,13=六面体)

    /**
     * @brief 构造函数
     * @param _id 单元编号
     * @param _nodes 单元节点列表
     * @param _type 单元类型
     */
    Element(int _id, const std::vector<int>& _nodes, int _type) 
        : id(_id), nodes(_nodes), type(_type) {}
}; 